package com.kkui.liuxin.service;


import com.alibaba.fastjson.JSONObject;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;


import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @author kkui
 *此类提供以用户名id为名的文件夹创建
 * 及用户上传文件保存
 * 服务
 */
@Slf4j
@Service
public class MkdirService {

//启动jar包位置
//    String parentPath = new ApplicationHome(getClass()).getSource().getParentFile().toString();

    /**
     * defaultParentFolder 这是用户存放文件大文件夹
     * file 用于实例化File
     * UserId 用户编号 从数据库中取
     * uFile 用户文件 包括两部分 路径和文件名 例如 E:/student/start.exe
     */
    String defaultParentFolder = System.getProperty("user.dir").replace("liu-xin","") + "icloud"+ File.separator;
    private File file;
    private int UserId;
    private String uFile;

    public String getDefaultParentFolder(){
        return defaultParentFolder;
    }



    /**
     * 判断用户是否有icloud文件夹
     * @param userId 用户ID,存放在数据库中
     * @return 存在 1 反之 0
     */
    public boolean isIcloud(int userId){
        boolean isExit = false;
        file = new File(defaultParentFolder);
        for (String f : Objects.requireNonNull(file.list())){
            if(f == String.valueOf(userId)){
                isExit = true;
            }
        }
        return isExit;
    }

    /**
     * 判断路径文件夹有无同名文件
     * @parm  filePath 文件路径
     * @return 有或无
     */
    public boolean isFileName(String filePath) {
        file = new File(defaultParentFolder + filePath);
        if (!file.isFile()){
            return false;
        }
        String name = file.getName();
        String path = file.getParent();
        file = new File(path);
        String[] list = file.list();
        //assert 断言 否则抛出AssertionError。
        assert list != null;
        for (String dir : list){
            file = new File(path + File.separator + dir);
            if (file.isFile()){
                if (file.getName().equals(name)){
                    return true;
                }
            }
        }
        return false;
    }


    /**
     * 创建文件 会经过路径是否为文件 文件是否存在
     * @param sonPath = defaultParentFolder + 文件路径
     * @return 文件是否创建成功
     */
    public boolean mkdirFile(String sonPath, MultipartFile multipartFile){
        log.info(sonPath);
        file = new File(defaultParentFolder+sonPath);
        if (file.exists()){
            return false;
        }
        if (!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        try {
            log.info(file.getPath());
            //transferTo 需要的是绝对路径
            multipartFile.transferTo(file);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;

    }

    /**
     * 删除文件 会经过判断路径是否为文件和文件是否存在
     * @param file 要删除文件
     * @return 是否成功删除
     */
    public void deleteFile(File file){


        if(file.isFile()){//是文件直接删了
            file.delete();
        }else{ //不是文件 是文件夹 便利出来
            File[] listFiles = file.listFiles();//listFiles方法：返回file路径下所有文件和文件夹的绝对路径
            for (File file2 : listFiles){
                deleteFile(file2);
            }

        }
        file.delete();


    }

    /**
     * 获取目标文件夹所有文件 null为空是指用户iCloud文件夹
     * @return json格式 包括time folder{name:value} file{name:value}
     */
    public String listMkdir(String sonPath){
        JSONObject object = new JSONObject();
        List<String> folder = new ArrayList<>();
        List<String> document = new ArrayList<>();
        String path = defaultParentFolder + sonPath;
        file = new File(path);
        if (!file.isDirectory() || !file.exists()){
            return null;
        }
        String[] list = file.list();
        //assert 断言 否则抛出AssertionError。
        assert list != null;
        for (String dir : list){
            file = new File(path + File.separator + dir);
            if (file.isDirectory()){
                folder.add(dir);
            }else if (file.isFile()){
                document.add(dir);
            }

        }

        Date date = new Date(System.currentTimeMillis());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String now = simpleDateFormat.format(date);

        object.put("folder",folder);
        object.put("file",document);
        object.put("time",now);

        return object.toString();
    }




    public void move(String oldPath,String newPath){
        File file = new File(defaultParentFolder + oldPath);
        File file1 = new File(defaultParentFolder + newPath);





        //路径存在且新路径不存在
        if (file.exists() && !file1.exists()){

            //两个路径都是文件
            if (file.isFile()){

                moveFile(file,file1);
            }else if (file.isDirectory()){

                moveFolder(file,file1);

            }

        }





    }
    //移动文件
    public void moveFile(File oldFile,File newFile){
        oldFile.renameTo(newFile);

    }
    //移动文件夹
    public void moveFolder(File oldFile, File newFile) {
        oldFile.renameTo(newFile);

        if (oldFile.listFiles() != null){
            for (File listFile : Objects.requireNonNull(oldFile.listFiles())) {
                if (listFile.isFile()){
                    String name = listFile.getName();
                    String path =  newFile.getPath();
                    File createFile = new File(path + name);
                    moveFile(listFile,createFile);
                }else if (listFile.isDirectory()){
                    String name = listFile.getName();
                    String path =  newFile.getPath();
                    File createFile = new File(path + name);
                    moveFolder(listFile,createFile);
                }

            }
        }



    }

}

